[Flutter] MaterialAppでパスルーティングを実装する
こんにちは、CX事業本部 Delivery部の若槻です。
今回は、FlutterのMaterialAppを使ってパスルーティングを実装してみました。
やってみた
Chrome (web)でアプリケーションを実行して試してみます。
そもそもMaterialAppって何
MaterialApp
はマテリアルデザイン(Material Design)を使用したApplication Widgetです。FlutterでマテリアルデザインのWidgetを構築する際にラップして使用します。
import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: const Text('Home'), ), ), ); } }
theme
でアプリのテーマを設定できます。またdebugShowCheckedModeBanner
をfalse
にするとデバッグ時にアプリ画面右上に表示されるバナーが非表示になります。
MaterialApp( home: Scaffold( appBar: AppBar( title: const Text('Home'), ), ), theme: ThemeData(brightness: Brightness.dark, primaryColor: Colors.blueGrey), debugShowCheckedModeBanner: false, );
MaterialAppでパスルーティングを実装
MaterialAppでパスルーティングはroutes
で設定できます。パス毎にレンダリングさせるScreen Widgetを設定します。
MaterialApp( routes: <String, WidgetBuilder>{ '/': (BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Home Route'), ), ); }, '/about': (BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('About Route'), ), ); } }, );
/
(ルート)パスを開いた場合。
/about
パスを開いた場合。
パスに応じてルーティングが出来ていますね。
またFlutter Web AppはSingle Page Applicationとなるため、アプリ内ではルーティングを使用してパス遷移をした場合はアセットのロードは行われない動作となります。
onGenerateRoute
を使用すればroute generatorを使用してルーティングを定義できます。ルート名(settings.name
)に応じてcase文などでルーティング先のScreenを指定します。initialRoute
を設定するとルートパスが渡された際のデフォルトのパスを指定できます。
Route<dynamic> generateRoute(RouteSettings settings) { switch (settings.name) { case '/': return MaterialPageRoute( builder: (_) => Scaffold( appBar: AppBar( title: const Text('Home Route'), ), )); case '/about': return MaterialPageRoute( builder: (_) => Scaffold( appBar: AppBar( title: const Text('About Route'), ), )); default: return MaterialPageRoute( builder: (_) => const Scaffold( body: Center(child: Text('No route defined')), )); } } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return const MaterialApp( onGenerateRoute: generateRoute, initialRoute: '/', ); } }
/
(ルート)パスを開いた場合。
/about
パスを開いた場合。
/hoge
パスを開いた場合。case文のデフォルトでレンダリングさせるScreen。
おわりに
FlutterのMaterialAppを使ってパスルーティングを実装してみました。
Flutterでマテリアルデザインを使用したアプリケーションを実装する際にはよく使うことになりそうです。
参考
以上